JavaScript详细教程(1) - 表达式和运算符

原始表达式

直接量

直接量是直接在程序中出现的常数值

1
"hello"

关键字

JavaScript的一些保留字构成了原始表达式

1
2
3
4
true
false
null
this

变量

1
2
3
i
sum
undeifined // undefined是全局变量,和null不同,她不是一个关键

对象和数组的初始化表达式

数组初始化表达式

1
var a = ["a", "b", "c"]

数组直接量中列表逗号之间的元素可以忽略,这时省略的空位会填充值undefined,例如,下面数组包含5个元素,其中三个元素是undefined

1
var b = [1, , , , 5]

数组直接量的元素列表结尾处可以留下单个逗号,这时并不会创建一个新的值为undefined的元素

对象初始化表达式

1
var o = {x:2, y:3}

函数定义表达式

某种意义上讲,函数定义表达式可称为“函数直接量”

1
var f = function(x){ return x * x ;}

对象创建表达式

对象创建表达式创建一个对象并调用一个函数(这个函数称之为构造函数)初始化新的对象的属性

1
2
new Object();
new Point(123);

运算符

运算顺序

假设存在a=1 那么“b=(a++)+a”的计算顺序为

1) 计算b
2) 计算a++(假设值为c)
3) 计算a
4) 计算c+a 
5) 将c+a的结果赋值给b

根据“+”运算符的定义 第2)步中的a++的结果依然是1,即C为1,随后a立即自增1,随后在进行第3)步计算a值时,a的值已经是2,所以b的值为3

“+”运算符

“+”号运算符的转换规则优先考虑字符串连接,如果其中一个操作数是字符串或者转换为字符串的对象,另外一个操作数将会转换为字符串,“+”运算符将进行字符串连接操作,如果两个操作数都不是类字符串,那么僵进行算数加法运算

一元加法

把操作数转换为数字(或者NaN),并返回这个转换后的数字,如果操作数本身就是数字,则直接返回这个数字

一元减法

把操作数转换为数字,然后改变运算结果的符号

相等运算符

检测两个操作数是否相等,可以允许进行类型转换

  • 如果一个值为null另一个是undefined,则它们相等
  • 如果一个值是数字,另一个字符串,则先将字符串转换为数字,然后进行比较
  • 如果其中一个值是true,则将其转换为1再进行比较,如果其中一个值是false,则将其转换为0再进行比较
  • 如果一个值是对象,另外一个值是数字,则对象通过toString()或者valueOf()转换为原始值再进行比较
  • javaScript核心内置类会首先用valueOf(),再用toString(),但日期类除外,日期类只使用toString()

严格相等运算符

检测两个操作数是否严格相等,不允许进行任何转换

  • 如果两个值类型不相同,则他们不相等
  • 如果两个值都是null或者undefined,则他们不相等
  • 如果两个值都是布尔值true或者false,则他们相等
  • 如果其中一个值时NaN或者两个操作数都是NaN,则他们不相等。
  • NaN与任何值都不相等,包括它本身。通过X!==X只有在x为NaN的时候,这个表达式才会为true
  • 如果两个值为数字且数值相等,则它们相等。如果一个值为0,另一个值为-0,则他们同样相等

比较运算符

对于数字和字符串操作符来说,加号运算符和比较运算符的行为都有所不同,加号运算符更加偏向于字符串,如果他的其中一个操作数是字符串的话,则进行字符串连接操作,而比较运算符更偏爱数字,只有在两个操作数都是字符串的时候,才会进行字符串比较

in运算符

in运算符希望它的左操作数是一个字符串或者可以转换位一个字符串,希望它的右操作数是一个对象,如果右侧的对象拥有一个名为左操作数值得属性名,则返回true,注意继承的属性也会返回true。

instanceof 运算符

instanceof运算符希望左操作数是一个对象,右操作数是一个标识对象的类(构造函数),如果左侧的对象时右侧类的实例,则返回true。
如果instanceof的左操作数不是对象的话,instanceof返回false。如果右操作数不是函数,则跑出一个类型错误异常

-------------本文到此结束,感谢您的阅读-------------